//
//package org.hotswap.agent.watch.remote;
//
//import org.hotswap.agent.logging.AgentLogger;
//import org.hotswap.agent.watch.WatchEventListener;
//import org.hotswap.agent.watch.WatchEventListenerManager;
//import org.hotswap.agent.watch.WatchFileEvent;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RequestMethod;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//
//@RestController
//@RequestMapping(
//        path = {"/hotswap"}
//)
//public class RemoteController {
//    protected static AgentLogger LOGGER = AgentLogger.getLogger(RemoteController.class);
//
//    public RemoteController() {
//    }
//
//    @RequestMapping(
//            path = {"/deploy"},
//            method = {RequestMethod.POST}
//    )
//    public String deploy(@RequestBody RemoteDeployCmd deployCmd) {
//        String classDefinition = deployCmd.getClassDefinition();
//        byte[] decode = Base64Util.decode(classDefinition);
//        WatchFileEvent event = new WatchFileEvent();
//        event.setDelete(false);
//        event.setEventType(deployCmd.getEventType());
//        event.setDirectory(false);
//        event.setClassDefinition(decode);
//        String convertPath = this.convertPath(deployCmd.getPath());
//        event.setPath(convertPath);
//        this.callListenersRemote(event);
//        return "0";
//    }
//
//    /**
//     * /Users/work/xxx/target/classes/com/xx/controller/Test.class -> com.xx.controller.Test.class
//     *
//     * @param path
//     * @return
//     */
//    private String convertPath(String path) {
//        if (null == path || 0 == path.length()) {
//            return path;
//        }
//        String[] classes = path.split("classes/");
//        if (0 == classes.length) {
//            return path;
//        }
//        return classes[1].replace("/", ".");
//    }
//
//    private void callListenersRemote(WatchFileEvent event) {
//        Map<String, List<WatchEventListener>> listeners = WatchEventListenerManager.getListeners();
//        if (null == listeners || listeners.isEmpty()) {
//            LOGGER.info("监听器为空");
//        }
//        boolean match = false;
//        Set<Map.Entry<String, List<WatchEventListener>>> entries = listeners.entrySet();
//        for (Map.Entry<String, List<WatchEventListener>> entry : entries) {
//            String key = entry.getKey();
//            LOGGER.info("path:{}", key);
//            List<WatchEventListener> watchEventListeners = entry.getValue();
//            if (event.getPath().startsWith(key)) {
//                match = true;
//                for (WatchEventListener listener : watchEventListeners) {
//                    try {
//                        listener.onEvent(event);
//                    } catch (Throwable var11) {
//                        LOGGER.error("异常", var11);
//                    }
//                }
//            }
//        }
//        if (!match) {
//            LOGGER.error("No match for  watch event '{}',  path '{}'", event, event.getPath());
//        }
//    }
//}
